/* 
 * File:   Repositorio.h
 * Author: gabilan
 *
 * Created on 24 de mayo de 2013, 19:33
 */

#ifndef REPOSITORIO_H
#define	REPOSITORIO_H

#include <string>
#include <iostream>
#include <set>
#include "common_RepoItem.h"
#include "common_Excepcion.h"

using namespace std;
using namespace TP;

namespace TP { namespace Archivos { 

typedef set<RepoItem*> SetRepoItem;

class Repositorio {
public:

    Repositorio();
    
    /* IniciarAPartirDeDirectorio:
     * 
     *      Inicia el repositorio escaneando el directorio especificado.  Para 
     * todo archivo contenido en el directorio, registra su ruta y el conjunto
     * de hashes que permiten detectar modificaciones.
     * 
     * Pre:  Debe existir la ruta especificada.  Caso contrario arroja una Excepcion
     * informando el problema.
     */
    bool IniciarAPartirDeDirectorio (const string & pRutaDirectorio) throw (Excepcion&);
    
    bool IniciarAPartirDeArchivoConfiguracion (const string &pRutaArchivoConfiguracion) throw (Excepcion&);
    
    string GetPath() const{
        return this->_path;
    }
    
    void AgregarRepoItem(RepoItem * r){
        this->lista_archs.insert(r);    
    }
    
    bool ExisteRepoItem(const string & filename);
    
    RepoItem * GetRepoItemByPath(const string & path);
    
    RepoItem * GetRepoItemByFilename(const string & filename);
    
    Repositorio (const string &pPath);
    
    virtual ~Repositorio();
    
private:
    
    /* ComputarHashesDeArchivo:
     * 
     *      Dado un item de repositorio, computa los hashes del archivo asociado
     * y los almacena en el item especificado.
     * 
     */
    void ComputarHashesDeArchivo (RepoItem* pItem) throw (Excepcion &);
    
    string _path;
    SetRepoItem lista_archs;
};

}}

#endif	/* REPOSITORIO_H */

